/**
 * 上传配置统一管理
 */

// 文件大小限制（单位：MB）
export const FILE_SIZE_LIMITS = {
  // 图片文件大小限制
  IMAGE: 10, // 10MB
  
  // 文档文件大小限制
  DOCUMENT: 50, // 50MB
  
  // 视频文件大小限制
  VIDEO: 200, // 200MB
  
  // 音频文件大小限制
  AUDIO: 100, // 100MB
  
  // 通用文件大小限制
  GENERAL: 100, // 100MB
} as const

// 支持的文件类型
export const SUPPORTED_FILE_TYPES = {
  // 图片类型
  IMAGE: ['image/jpeg', 'image/jpg', 'image/png', 'image/gif', 'image/webp', 'image/bmp'],
  
  // 文档类型
  DOCUMENT: [
    'application/pdf',
    'application/msword',
    'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
    'application/vnd.ms-excel',
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    'application/vnd.ms-powerpoint',
    'application/vnd.openxmlformats-officedocument.presentationml.presentation',
    'text/plain',
    'text/csv'
  ],
  
  // 视频类型
  VIDEO: ['video/mp4', 'video/avi', 'video/mov', 'video/wmv', 'video/flv', 'video/webm'],
  
  // 音频类型
  AUDIO: ['audio/mp3', 'audio/wav', 'audio/ogg', 'audio/aac', 'audio/flac']
} as const

// 文件类型扩展名映射
export const FILE_EXTENSIONS = {
  IMAGE: ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp'],
  DOCUMENT: ['.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.txt', '.csv'],
  VIDEO: ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.webm'],
  AUDIO: ['.mp3', '.wav', '.ogg', '.aac', '.flac']
} as const

/**
 * 验证文件类型
 * @param file 文件对象
 * @param allowedTypes 允许的文件类型数组
 * @returns 是否为允许的类型
 */
export const validateFileType = (file: File, allowedTypes: string[]): boolean => {
  return allowedTypes.includes(file.type)
}

/**
 * 验证文件大小
 * @param file 文件对象
 * @param maxSizeMB 最大大小（MB）
 * @returns 是否符合大小限制
 */
export const validateFileSize = (file: File, maxSizeMB: number): boolean => {
  const maxSizeBytes = maxSizeMB * 1024 * 1024
  return file.size <= maxSizeBytes
}

/**
 * 格式化文件大小
 * @param bytes 字节数
 * @returns 格式化后的大小字符串
 */
export const formatFileSize = (bytes: number): string => {
  if (bytes === 0) return '0 Bytes'
  
  const k = 1024
  const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB']
  const i = Math.floor(Math.log(bytes) / Math.log(k))
  
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
}

/**
 * 获取文件类型分类
 * @param file 文件对象
 * @returns 文件类型分类
 */
export const getFileCategory = (file: File): keyof typeof SUPPORTED_FILE_TYPES | 'UNKNOWN' => {
  const mimeType = file.type.toLowerCase()
  
  if (SUPPORTED_FILE_TYPES.IMAGE.includes(mimeType)) return 'IMAGE'
  if (SUPPORTED_FILE_TYPES.DOCUMENT.includes(mimeType)) return 'DOCUMENT'
  if (SUPPORTED_FILE_TYPES.VIDEO.includes(mimeType)) return 'VIDEO'
  if (SUPPORTED_FILE_TYPES.AUDIO.includes(mimeType)) return 'AUDIO'
  
  return 'UNKNOWN'
}

/**
 * 通用文件验证函数
 * @param file 文件对象
 * @param options 验证选项
 * @returns 验证结果
 */
export interface FileValidationOptions {
  allowedTypes?: string[]
  maxSizeMB?: number
  category?: keyof typeof SUPPORTED_FILE_TYPES
}

export interface FileValidationResult {
  valid: boolean
  error?: string
}

export const validateFile = (file: File, options: FileValidationOptions = {}): FileValidationResult => {
  const {
    allowedTypes,
    maxSizeMB,
    category
  } = options
  
  // 如果指定了分类，使用分类的默认配置
  if (category) {
    const categoryTypes = SUPPORTED_FILE_TYPES[category]
    const categoryMaxSize = FILE_SIZE_LIMITS[category]
    
    if (!validateFileType(file, categoryTypes)) {
      return {
        valid: false,
        error: `不支持的文件类型，请选择 ${FILE_EXTENSIONS[category].join(', ')} 格式的文件`
      }
    }
    
    if (!validateFileSize(file, categoryMaxSize)) {
      return {
        valid: false,
        error: `文件大小不能超过 ${categoryMaxSize}MB`
      }
    }
    
    return { valid: true }
  }
  
  // 自定义类型验证
  if (allowedTypes && !validateFileType(file, allowedTypes)) {
    return {
      valid: false,
      error: '不支持的文件类型'
    }
  }
  
  // 自定义大小验证
  if (maxSizeMB && !validateFileSize(file, maxSizeMB)) {
    return {
      valid: false,
      error: `文件大小不能超过 ${maxSizeMB}MB`
    }
  }
  
  return { valid: true }
}

/**
 * 图片文件验证（快捷方法）
 */
export const validateImageFile = (file: File): FileValidationResult => {
  return validateFile(file, { category: 'IMAGE' })
}

/**
 * 文档文件验证（快捷方法）
 */
export const validateDocumentFile = (file: File): FileValidationResult => {
  return validateFile(file, { category: 'DOCUMENT' })
}

/**
 * 通用文件验证（快捷方法）
 */
export const validateGeneralFile = (file: File): FileValidationResult => {
  return validateFile(file, { maxSizeMB: FILE_SIZE_LIMITS.GENERAL })
}
